<?php
/**
 * Klasa do debugowania
 *
 * @author Miron Pawlik
 **/


class Debug
{
	private $times;
	private $variables;
	private $backtraces;
	private $queries;
	
	/**
	 * Rozpoczynanie liczenia czasu wykonania kodu
	 *
	 */
	public function __construct()
	{
		$this->queries = 0;
		$this->begin('main');
	}
	
	/**
	 * Zwieksza licznik zapytań o 1. Wykonywane przy okazji każdego zapytania
	 * @return int numer aktualnego zapytania
	 */
	public function queryCount()
	{
		return $this->queries++;
	}
	
	/**
	 * Rozpoczynanie liczenia czasu wykonania fragmentu kodu o identyfikatorze $id
	 * @param String $id identyfikator danego fragmentu kodu
	 * @return void
	 */
	public function begin($id)
	{
		$this->times[$id][0] = $this->getmicrotime(true);
	}
	
	/**
	 * Zatrzymywanie liczenia czasu fragmentu kodu o identyfikatorze $id
	 * @param String $id identyfikator danego fragmentu kodu
	 * @return void
	 */
	public function end($id)
	{
		$this->times[$id][1] = $this->getmicrotime();
	}
	
	/**
	 * Wyświetlanie dokładnej zawartości zmiennej
	 *
	 * @param mixed $variable zmienna ktorej wartosc chcemy zobaczyć
	 * @param String $label Etykieta zmiennej
	 * @param boolean $show Czy zmienna ma być wyświetlona od razu, czy dopiero przy podsumowaniu
	 * @return void
	 */
	public function dump($variable, $label = null, $show=false)
	{
		if($show)
		{
			echo "$label => ";
			var_dump($variable);
		}
		else
		{
			ob_start();
			var_dump($variable);
			$buf = ob_get_contents();
			ob_end_clean();
			if($label)
				$this->variables[$label] = $buf;
			else
				$this->variables[] = $buf;
		}
	}
	
	public function backtrace($label)
	{
		$this->backtraces[$label] = debug_backtrace();
	}
	
	//public function setStopWatch($id);
	
	/**
	 * Wyświetlanie bloku z podsumowaniem danych zebranych do tej pory:
	 * czasy wykonania całej strony i poszczególnych fragmentów kodu, liczba zapytań i wartości wybranych zmiennych
	 * @return void
	 */
	public function show()
	{
		echo "czasy: \n";
		foreach($this->times as $k => $time)
		{
			if(!$time[1])
				$time[1] = $this->getmicrotime();
			echo "   $k> ".($time[1] - $time[0])."\n"; 
		}
		if($this->variables)
		{
			echo "zmienne:\n";
			foreach($this->variables as $k => $v)
				echo "   <strong>$k</strong> <div class=\"debugInfo\">".$v."</div>";
		}
		if($this->backtraces)
		{
			echo "backtracy:\n";
			foreach($this->backtraces as $k => $v)
				echo "   <strong>$k</strong> <div class=\"debugInfo\">".var_export($v,1)."</div>";
		}
			
	}
	
	private function getmicrotime(){
    	list($usec, $sec) = explode(" ",microtime());
    	return ((float)$usec + (float)$sec);
    } 
	
}


